1 module hip.hiprenderer.backend.d3d.d3dframebuffer;
2 
3 version(Windows):
4 version(DirectX):
5 
6 import directx.d3d11;
7 
8 import hip.error.handler;
9 import hip.hiprenderer.renderer;
10 import hip.hiprenderer.framebuffer;
11 import hip.hiprenderer.shader;
12 import hip.hiprenderer.backend.d3d.d3drenderer;
13 import hip.hiprenderer.backend.d3d.d3dtexture;
14 
15 
16 private __gshared ID3D11RenderTargetView nullRenderTargetView = null;
17 
18 class Hip_D3D11_FrameBuffer : IHipFrameBuffer
19 {
20     Hip_D3D11_Texture retTexture;
21     ID3D11Texture2D renderTargetTexture;
22 	ID3D11RenderTargetView renderTargetView;
23 	ID3D11ShaderResourceView shaderResourceView;
24 
25     this(uint width, uint height)
26     {
27         create(width, height);
28     }
29 
30 
31     void create(uint width, uint height)
32     {
33         D3D11_TEXTURE2D_DESC textureDesc;
34         HRESULT hres;
35         D3D11_RENDER_TARGET_VIEW_DESC renderTargetViewDesc;
36 	    D3D11_SHADER_RESOURCE_VIEW_DESC shaderResourceViewDesc;
37 
38         textureDesc.Width = width;
39         textureDesc.Height = height;
40         textureDesc.MipLevels = 1;
41         textureDesc.ArraySize = 1;
42         textureDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
43         textureDesc.SampleDesc.Count = 1;
44         textureDesc.Usage = D3D11_USAGE_DEFAULT;
45         textureDesc.BindFlags = D3D11_BIND_RENDER_TARGET | D3D11_BIND_SHADER_RESOURCE;
46         textureDesc.CPUAccessFlags = 0;
47         textureDesc.MiscFlags = 0;
48         ErrorHandler.startListeningForErrors("D3D11 Framebuffer creation");
49         
50         hres = _hip_d3d_device.CreateTexture2D(&textureDesc, null, &renderTargetTexture);
51         if(FAILED(hres))
52             ErrorHandler.showErrorMessage("Texture creation failed",
53             "Could not create a texture2D for D3D11 framebuffer");
54         HipRenderer.exitOnError();
55 
56         renderTargetViewDesc.Format = textureDesc.Format;
57         renderTargetViewDesc.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D;
58         renderTargetViewDesc.Texture2D.MipSlice = 0;
59 
60         hres = _hip_d3d_device.CreateRenderTargetView(renderTargetTexture, &renderTargetViewDesc, &renderTargetView);
61         if(FAILED(hres))
62             ErrorHandler.showErrorMessage("D3D11 RenderTargetView creation failure", "");
63         HipRenderer.exitOnError();
64 
65         shaderResourceViewDesc.Format = textureDesc.Format;
66         shaderResourceViewDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
67         shaderResourceViewDesc.Texture2D.MostDetailedMip = 0;
68         shaderResourceViewDesc.Texture2D.MipLevels = 1;
69 
70         hres = _hip_d3d_device.CreateShaderResourceView(renderTargetTexture, &shaderResourceViewDesc, &shaderResourceView);
71         if(FAILED(hres))
72             ErrorHandler.showErrorMessage("D3D11 ShaderResourceView creation failure", "");
73         HipRenderer.exitOnError();
74         ErrorHandler.stopListeningForErrors();
75 
76         retTexture = new Hip_D3D11_Texture();
77         retTexture.resource = shaderResourceView;
78         retTexture.texture = renderTargetTexture;
79         retTexture.updateSamplerState();
80         
81     }
82     void resize(uint width, uint height){}
83     void bind()
84     {
85         _hip_d3d_context.OMSetRenderTargets(1, &renderTargetView, null);
86     }
87     void unbind()
88     {
89         _hip_d3d_context.OMSetRenderTargets(1, &_hip_d3d_mainRenderTarget, null);
90     }
91     void clear()
92     {
93         float[4] color;
94         color[] = 0;
95         color[3] = 1.0f;
96         _hip_d3d_context.ClearRenderTargetView(renderTargetView, color.ptr);
97     }
98 
99     IHipTexture getTexture(){return retTexture;}
100     void draw(){}
101     void dispose()
102     {
103         if(shaderResourceView)
104         {
105             shaderResourceView.Release();
106             shaderResourceView = null;
107         }
108         if(renderTargetView)
109         {
110             renderTargetView.Release();
111             renderTargetView = null;
112         }
113         if(renderTargetTexture)
114         {
115             renderTargetTexture.Release();
116             renderTargetTexture = null;
117         }
118     }
119 
120 
121 }